﻿using System.Text;
using RssToolkit.Rss;

namespace BlogsAPI.Search
{
    using Abstract;
    using System.Web;
    using System.Collections.Generic;
    using System.Linq;
    using Newtonsoft.Json.Linq;
    using Newtonsoft.Json;
    using System.IO;
    using System.Net;
    using System.Diagnostics;
    using System;

    /// <summary>
    /// Класс для поиска в Youtube
    /// </summary>
    /// <remarks>http://code.google.com/apis/youtube/2.0/developers_guide_protocol.html</remarks>
    public class YoutubeSearch : BasicSearch
    {
        /// <summary>
        /// Конструктор
        /// </summary>
        public YoutubeSearch()
        {
            separator_and = " AND ";
            separator_or = "|";
            separator_not = "-";
        }


        /// <summary>
        /// Настройки поисковика
        /// </summary>
        public string SearchOptions = "&orderby=published&lang=ru&v=2&alt=rss&safeSearch=none&max-results=50";

        /// <summary>
        /// Ключ необходимый для проведения запроса
        /// </summary>
        private String DeveloperKey =
            "AI39si5aToZCNB1iGVeVySREZaWg8NkqfIkXsDr9gVQ0ZeZ2Hxwp29aJXpUiVbJDUiz78cHH5Wy9R3Owa3q3Z2j1ew1bM_KQ2w";

        /// <summary>
        /// ссылка для запросов. scoring=d - сортировка по дате
        /// </summary>
        protected virtual string SearchUrl
        {
            get
            {
                return "http://gdata.youtube.com/feeds/api/videos?key={0}{1}&q={2}";
            }
        }

        /// <summary>
        /// поиск в гугле-блогах
        /// </summary>
        /// <param name="text">текст для поиска</param>
        /// <param name="fromDate">дата начиная с которой искать объекты, может быть нулом, тогде по максимуму!</param>
        /// <returns>массив постов удовлетворяющих поиску</returns>
        public override BlogPost[] SearchFor(String text, DateTime? fromDate)
        {
            BlogPost[] oRes = new BlogPost[0];
            try
            {
                if (!String.IsNullOrEmpty(text))
                {
                    HttpWebRequest myHttpWebRequest = MakeRequest(String.Format(SearchUrl, DeveloperKey, SearchOptions, text));
                    myHttpWebRequest.AllowAutoRedirect = false;
                    myHttpWebRequest.Method = "GET";
                    HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                    string reply = (new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.UTF8)).ReadToEnd();
                    myHttpWebResponse.Close();
                    //а теперь разбираем
                    RssDocument rss = RssDocument.Load(reply);
                    if (rss != null)//разобрали, и начинаем считать
                    {
                        for (int i = 0; i < rss.Channel.Items.Count; i++)
                        {
                            //если пост слишком старый, то заканчиваем работу.
                            if ((fromDate != null && rss.Channel.Items[i].PubDateParsed < fromDate)
                                || rss.Channel.YaCount < oRes.Length)//слишком 
                            {
                                break;
                            }
                            BlogPost bp = ParseBlogPost(rss.Channel.Items[i]);
                            if (bp != null)
                            {
                                bp.SpecialParam = rss.Channel.Items[i].Author;//сохраняем автора в доп.поле
                                Array.Resize(ref oRes, oRes.Length + 1);
                                oRes[oRes.Length - 1] = bp;
                            }
                        }
                    }
                }
            }
            catch(Exception e1)
            {
                Debug.WriteLine("SearchFor failed cause " + e1.Message);
            }
            return oRes;
        }


        /// <summary>
        /// поиск в гугле-блогах
        /// </summary>
        /// <param name="link">искомая ссылка на ресурс</param>
        /// <param name="fromDate">дата начиная с которой искать объекты, может быть нулом, тогде по максимуму!</param>
        /// <returns>массив постов удовлетворяющих поиску</returns>
        public override BlogPost[] SearchFor(Uri link, DateTime? fromDate)
        {
            return new BlogPost[0];//нет поиска со ссылками
        }

        /// <summary>
        /// Формирование разобранного поста из того что дает яндекс.
        /// </summary>
        /// <param name="yad"></param>
        /// <returns></returns>
        private BlogPost ParseBlogPost(RssItemYandex yad)
        {
            return new BlogPost
            {
                Link = new Uri(yad.Link),
                Body = yad.Description,
                Subject = yad.Title,
                Existance = true,
                Published = yad.PubDateParsed
            };
        }

        private static string PerformRequest(string url)
        {
            WebRequest request = WebRequest.Create(url);

            using (WebResponse response = request.GetResponse())
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                return reader.ReadToEnd();
            }
        }

    }
}
